package com.qs.javame.proxy.jdk;

import sun.misc.ProxyGenerator;

import java.io.File;
import java.io.FileOutputStream;


/**
 * 测试类：
 * 1、测试jdk动态代理的使用；
 * 2、使用ProxyGenerator.generateProxyClass()方法生成动态代理类；
 *
 * @since 2019年02月18日10:45:57
 */
public class TestJdkProxy {

    private static final String filePathDir = "/Users/qinyupeng/IdeaProjects/MyProjects/javaee-parent/javame-test/src/main/java/com/qs/javame/proxy/jdk/";

    public static void main(String[] args) {

        UserService userService = new UserServiceImpl();
        MyInvocationHandler invocationHandler = new MyInvocationHandler(userService);
        Object proxy = invocationHandler.getProxy();
        if (proxy instanceof UserService) {
            userService = (UserService) proxy;
            userService.addUser();


            //生成动态代理类class文件
            createProxyClassFile();
        }
    }


    /**
     * 生成动态代理类字节码文件，通过反编译可以明白两个问题：
     * 1、自定义实现的InvocationHandler接口中invoke()方法什么时候调用？
     * 2、为什么jdk代理是针对接口的？
     */
    private static void createProxyClassFile() {
        String name = "$Proxy";
        byte[] data = ProxyGenerator.generateProxyClass(name, new Class[]{UserService.class});
        try {
            File file = new File(filePathDir + name + ".class");
            FileOutputStream out = new FileOutputStream(file);
            out.write(data);
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
